package ngramencoding;

import java.io.*;
import java.util.*;
import java.io.IOException;

/** ============================================================================
 * A classe Frequencia lê o arquivo *.seq e contabiliza, por meio do programa count.pl, a freqüência 
 * de cada um dos bigrams inseridos na seqüência de nucleotídeos desse arquivo. Posteriomente, gera 
 * uma saída no formato *.frq.
 * nome_arquivo.seq ==> nome_arquivo.frq
 * @author Susan Higashi
 */
public class FrqCounter 
{   
    /** ------------------------------------------------------------------------
     * Apresenta a caixa de diálogo para selecionar os arquivos contendo as proteínas
     * que serão calculadas as freqüências e o diretório de destino dos arquivos 
     * processados. 
     *  
     * Executa o programa 'count.pl' do NSP (Ngram Statistics Package) para 
     * todos os arquivos selecionados. 
     * 
     */
    public static void main(String[] args) throws IOException 
    {
        Utilities util = new Utilities();
        String os = util.getOS();

        //SELECIONA ARQUIVOS PARA SEREM PROCESSADOS 
        File startingDir = new File("/home/su/Desktop/teste/2_seq/rhizobium_28.seq");
        Utilities utilFl = new Utilities(); 
        List <File> files = utilFl.getFileListing(startingDir);
        
        //SELECIONA O DIRETORIO DE DESTINO       
        // diretorio de saida do arquivo de entrada das RN
        String outputDirPath = "/mnt/files/artigo/dev/trunk/ngramencoding/data/3-frq/bradyrhizobium-57/";
        File outputDir = new File(outputDirPath);
        
        String arquivoOrigem, arquivoDestino, arqOrigemSemExtensao, comando;
        
        // COMECA A CONTAR O TEMPO
        long initialTime = System.currentTimeMillis();
        
        // processa todos os arquivos com saida negativa para a rede Rhizobium
        for (File file : files)
        {
            arquivoOrigem = file.getPath();
            
            int idFim = file.getName().indexOf(".");
            arqOrigemSemExtensao = file.getName().substring(0, idFim);

            if (os.equals("windows"))   arquivoDestino = outputDir.getPath()+ "\\" + arqOrigemSemExtensao+".frq";
            else                        arquivoDestino = outputDir.getPath()+"/"+arqOrigemSemExtensao+".frq";

            //executa count.pl que contabiliza as frequencias de cada trigram 
	    //count.pl faz parte do NSP (Ngram Statistics Package) http://www.d.umn.edu/~tpederse/nsp.html
            comando = "/mnt/files/artigo/dev/trunk/ngramencoding/src/ngramencoding/count.pl --ngram 3 " + arquivoDestino + " " + arquivoOrigem; // linux
            //comando = "perl C:\\count.pl --ngram 3" + arquivoDestino + " " + arquivoOrigem; // windows
            Runtime.getRuntime().exec(comando);            
        }
        
        float totalTime = ((float) (System.currentTimeMillis() - initialTime)) / 1000;
        System.out.println(totalTime + " seconds");
    }
}

/** ============================================================================
 * A classe FiltroSequencia extende a classe abstrata 
 * javax.swing.filechooser.FileFilter e filtra os tipos de arquivos 
 * aceitos, nesse caso arquivos *.seq.
 */
class FiltroSequencia extends javax.swing.filechooser.FileFilter
{
    /** ------------------------------------------------------------------------
     * Exibe apenas os arquivos definidos nesse filtro.
     * Método declarado  na classe abstrata FileFilter. 
     * @param file arquivo a ser filtrado. 
     */
    public boolean accept(File file) 
    {
        if(file.isDirectory()) return true;
  
        String fileName = file.getName();
        
        if(fileName.endsWith(".seq")) return true;
        
        return false;
    }

    /** ------------------------------------------------------------------------
     * Descrição do filtro. 
     * Método declarado na classe abstrata. 
     */
    public String getDescription()
    {
        return "Arquivos de Seqüência (*.seq)";
    }    
}